package com.sihai.core;

import java.io.Serializable;

/**
 * <code>Paginator</code>,分页对象
 */
public class Paginator implements Serializable {

	public static Paginator EMPTY = new Paginator() {

		private static final long serialVersionUID = 2319272168217517170L;

		@Override
		public int getTotalcount() {
			return 0;
		}

		@Override
		public int getLastPage() {
			return 1;
		}

		@Override
		public int getCount() {
			return 0;
		}

		@Override
		public int getPage() {
			return 1;
		}

		@Override
		public int getFirstPage() {
			return 1;
		}

		@Override
		public int getPreviousPage() {
			return 0;
		}
	};

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = 620814200992640712L;

	/**
	 * 总记录数
	 */
	protected int totalcount;

	/**
	 * 每页显示记录数
	 */
	private int count;

	/**
	 * 当前请求页面 从第一页开始
	 */
	private int page;

	/**
     *
     */
	private Paginator() {
	}

	/**
	 * create Paginator by count,page and totalcount
	 * 
	 * @param count 每页显示记录数
	 * @param page 当前请求页面
	 * @param totalcount 总记录数
	 */
	public Paginator(int count, int page, int totalcount) {
		this();
		this.count = count;
		this.totalcount = totalcount;

		// 小于第一页
		if (page < 1)
			this.page = 1;
		// 大于最后一页
		else if (page > this.getLastPage())
			this.page = this.getLastPage();
		else
			this.page = page;
	}

	/**
	 * create Paginator by count and totalcount
	 * 
	 * @param count 每页显示记录数
	 * @param totalcount 总记录数
	 */
	public Paginator(int count, int totalcount) {
		this(count, 1, totalcount);
	}

	/**
	 * @return 总记录数
	 */
	public int getTotalcount() {
		return this.totalcount;
	}

	/**
	 * @return 得到总页面数量
	 */
	public int getLastPage() {
		// 不足一页
		if (this.getTotalcount() < this.getCount())
			return 1;
		int remainder = this.getTotalcount() % this.getCount();// 余数
		int quotient = this.getTotalcount() / this.getCount();// 商
		return remainder == 0 ? quotient : quotient + 1;
	}

	/**
	 * 到最后一页
	 */
	public boolean last() {
		this.page = this.getLastPage();
		return true;
	}

	/**
	 * @return 每页显示记录数
	 */
	public int getCount() {
		return this.count;
	}

	/**
	 * @return 当前页
	 */
	public int getPage() {
		return this.page;
	}

	/**
	 * 刷新
	 */
	public boolean refresh() {
		return true;
	}

	/**
	 * @return 下一页
	 */
	public int getNextPage() {
		if (this.getPage() == this.getLastPage())
			return this.getLastPage();
		else
			return this.getPage() + 1;
	}

	/**
	 * @return 是否有下一页
	 */
	public boolean isNextExists() {
		return this.getPage() != this.getLastPage();
	}

	/**
	 * 到下一页
	 * 
	 * @return
	 */
	public boolean next() {
		if (this.isNextExists()) {
			this.page += 1;
			return true;
		}
		return false;
	}

	/**
	 * 到第page页
	 * 
	 * @param page
	 * @return 是否导航成功 page如果在有效范围内返回true
	 */
	public boolean toPage(int page) {

		if (page > this.getLastPage() || page < this.getFirstPage()) {
			return false;
		}

		this.page = page;
		return true;
	}

	/**
	 * @return 上一页
	 */
	public int getPreviousPage() {
		return this.getPage() == 1 ? 1 : this.getPage() - 1;
	}

	/**
	 * @return 是否有上一页
	 */
	public boolean isPreviousExists() {
		return this.getPage() != 1;
	}

	/**
	 * 到前一页
	 * 
	 * @return
	 */
	public boolean previous() {
		if (this.isPreviousExists()) {
			this.page -= 1;
			return true;
		}

		return false;
	}

	/**
	 * @return 第一页
	 */
	public int getFirstPage() {
		return 1;
	}

	/**
	 * 导航到第一页
	 * 
	 * @return 是否导航成功
	 */
	public boolean first() {
		this.page = 1;
		return true;
	}

	/**
	 * 根据当前Paginator对象创建Limit
	 * 
	 * @return
	 */
	public Limit createLimit() {
		return new Limit((this.page - 1) * this.count, this.count);
	}

	/**
	 * 总记录数发生变化，需要重新计算分页信息
	 * 
	 * @param totalcount
	 */
	public void totalcountChanged(int totalcount) {
		this.totalcount = totalcount;
	}
}
